package com.tarena.lbs.content.service.impl;

import com.github.pagehelper.PageInfo;
import com.tarena.lbs.base.protocol.pager.PageResult;
import com.tarena.lbs.content.dao.repository.CategoryESRepository;
import com.tarena.lbs.content.dao.repository.CategoryRepository;
import com.tarena.lbs.content.pojo.param.ArticleCategoryParam;
import com.tarena.lbs.content.pojo.po.ArticleCategoryPO;
import com.tarena.lbs.content.pojo.po.ArticleSearchPO;
import com.tarena.lbs.content.pojo.query.ArticleCategoryQuery;
import com.tarena.lbs.content.pojo.vo.ArticleCategoryVO;
import com.tarena.lbs.content.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.PropertySource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import com.alibaba.nacos.common.utils.CollectionUtils;

import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryESRepository categoryESRepository;
    @Autowired
    private CategoryRepository categoryRepository;

    @Override
    public PageResult<ArticleCategoryVO> pageList() {
        // 创建一个新的分页结果对象，用于存储最终的分页查询结果
        PageResult<ArticleCategoryVO> voPage = new PageResult<>();
        //调用 categoryRepository 的 gePages 方法进行分页查询
        PageInfo<ArticleCategoryPO> pageInfo = categoryRepository.pageList();
        // 将分页信息中的页码设置到分页结果对象中
        voPage.setPageNo(pageInfo.getPageNum());
        // 将分页信息中的每页数量设置到分页结果对象中
        voPage.setPageSize(pageInfo.getPageSize());
        // 将分页信息中的总记录数设置到分页结果对象中
        voPage.setTotal(pageInfo.getTotal());
        //声明一个文章分类列表
        List<ArticleCategoryVO> vos = null;
        // 从分页信息中获取文章持久化对象列表
        List<ArticleCategoryPO> pos = pageInfo.getList();
        log.info("原始文章分类列表:{}",pos);
        List<ArticleCategoryPO> sortedList = pos.stream()
                .sorted(Comparator.comparingInt(ArticleCategoryPO::getId))
                .collect(Collectors.toList());
        log.info("排序后的文章分类列表:{}",sortedList);
        // 判断持久化对象列表是否不为空
        if (CollectionUtils.isNotEmpty(sortedList)) {
            vos = sortedList.stream().map(po->{
                ArticleCategoryVO vo = new ArticleCategoryVO();
                BeanUtils.copyProperties(po, vo);
                return vo;
            }).collect(Collectors.toList());
        }
        voPage.setObjects(vos);
        return voPage;
    }

    @Override
    public void save(ArticleCategoryParam param) {
        log.debug("文章分类保存业务处理,入参:{}",param);
        ArticleCategoryPO po = new ArticleCategoryPO();
        BeanUtils.copyProperties(param, po);
        po.setCreateTime(new Date());
        // 如果是新增文章（ID为null），则生成递增的数字ID
        if (po.getId() == null) {
            // 查询当前最大的ID
            Integer maxId = getMaxId();
            // 新ID为最大ID+1，如果没有任何记录，则从1开始
            po.setId(maxId + 1);
        }
        po.setCreateTime(new Date());
        categoryESRepository.save(po);
        log.debug("文章分类保存业务处理完成");
    }

    @Override
    public void delete(Integer id) {
        log.debug("文章分类删除业务处理,入参:{}",id);
        categoryESRepository.deleteById(id);
    }

    private Integer getMaxId() {
        // 注意：这种方法在高并发场景下可能不是完全准确
        // 但在您的场景下应该足够使用
        Iterable<ArticleCategoryPO> allCategories = categoryESRepository.findAll();
        Integer maxId = 0;
        for (ArticleCategoryPO category : allCategories) {
            if (category.getId() != null && category.getId() > maxId) {
                maxId = category.getId();
            }
        }
        return maxId;
    }
}
